package questionmanager;

import gui.CustomJButton;
import gui.GUIMain;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import rmi.Question;

public class GUIQuestionManagerRight extends JPanel{
	private static final long serialVersionUID = 1L;
	private GUIQuestionManager parent;
	private GUIQuestionDisplay display;
	private CustomJButton addButton;
	private CustomJButton moveButton;
	private CustomJButton delButton;
	private JPopupMenu menu;
	private int currentClickedRow;
	private int[] questionType;
	
	public GUIQuestionManagerRight(GUIQuestionManager parent) {
		this.parent = parent;
		setOpaque(false);
		setLayout(new BorderLayout());
		setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10));
		display = new GUIQuestionDisplay(GUIQuestionDisplay.FROM_QUESTIONTYPE,true,true);
		createPopupMenu();
		
		JPanel bottomPanel;
		bottomPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
		bottomPanel.setOpaque(false);
		addButton = new CustomJButton("Thêm", 100, 30, Color.WHITE, CustomJButton.DARKER,
				Color.darkGray, 2, false, true);
		addButton.addActionListener(new AddQuestionAction());
		moveButton = new CustomJButton("Chuyển", 100, 30, Color.WHITE, CustomJButton.DARKER,
				Color.darkGray, 2, false, true);
		moveButton.addActionListener(new MoveQuestionAction());
		moveButton.setEnabled(false);
		delButton = new CustomJButton("Xoá", 100, 30, Color.WHITE, CustomJButton.DARKER,
				Color.darkGray, 2, false, true);
		delButton.addActionListener(new DeleteQuestionAction());
		delButton.setEnabled(false);
		bottomPanel.add(addButton);
		bottomPanel.add(moveButton);
		bottomPanel.add(delButton);
		add(bottomPanel, BorderLayout.SOUTH);
		
		display.getJTable().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
		display.getJTable().addMouseListener(new QuestionMouseListener());
		display.getJTable().getSelectionModel().addListSelectionListener(new QuestionSelectionListener());
		add(display,BorderLayout.CENTER);
	}
	
	public void refresh(int[] qt){
		questionType = qt;
		display.getQuestionFromDB(qt);
	}
	
	public GUIQuestionManager getParentEx(){
		return this.parent;
	}
	
	private void createPopupMenu(){
		menu  = new JPopupMenu();
		JMenuItem menuItem;
		menuItem = new JMenuItem("Chỉnh sửa...");
		menuItem.addActionListener(new QuestionEdit());
		menu.add(menuItem);
		
		menuItem = new JMenuItem("Xoá");
		menuItem.addActionListener(new QuestionDelete());
		menu.add(menuItem);
	}
	
	class AddQuestionAction extends AbstractAction{
		
		private static final long serialVersionUID = 1L;

		@Override
		public void actionPerformed(ActionEvent arg0) {
			try {
				GUIQuestionAdd ex = new GUIQuestionAdd(parent.getFrame());
				ex.addWindowListener(new JDialogWindowListener());
				ex.setSize(500, 350);
				ex.setLocationRelativeTo(parent);
				ex.setVisible(true);
			} catch (Exception e) {
				JOptionPane.showMessageDialog(parent, "Không thể tạo câu hỏi khi không tồn tại Loại câu hỏi nào", 
						"Thông báo", JOptionPane.ERROR_MESSAGE);
				return;
			}
		}
	}
	
	class MoveQuestionAction extends AbstractAction{

		private static final long serialVersionUID = 1L;

		@Override
		public void actionPerformed(ActionEvent e) {
			ArrayList<Integer> qIDList = new ArrayList<>();
			int[] selectedRow =  display.getJTable().getSelectedRows();
			for(int i = 0;i<selectedRow.length; i++){
				Question temp = (Question) display.getModel().getValueAt(selectedRow[i], 0);
				qIDList.add(temp.getQuestionID());
			}
			GUIQuestionMove ex = new GUIQuestionMove(parent.getFrame(), qIDList);
			ex.addWindowListener(new JDialogWindowListener());
			ex.setSize(300, 150);
			ex.setLocationRelativeTo(parent);
			ex.setVisible(true);
		}
	}
	
	class DeleteQuestionAction extends AbstractAction{

		private static final long serialVersionUID = 1L;

		@Override
		public void actionPerformed(ActionEvent e) {
			int result = JOptionPane.showConfirmDialog(parent, 
					"Bạn có chắc chắn muốn xoá danh sách các câu hỏi được chọn?", 
					"Thông báo", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
			if (result == JOptionPane.YES_OPTION) {
				ArrayList<Question> qIDList = new ArrayList<>();
				int[] selectedRow =  display.getJTable().getSelectedRows();
				boolean doneAll = true;
				for(int i =0;i<selectedRow.length; i++){
					Question temp = (Question) display.getModel().getValueAt(selectedRow[i], 0);
					qIDList.add(temp);
				}
				for(Question count : qIDList){
					try {
						if(GUIMain.getDb().CheckIfQuestionRemovable(count.getQuestionID())){
							if(GUIMain.getDb().DeleteQuestion(count.getQuestionID())){
							}else{
								JOptionPane.showMessageDialog(parent, 
										"Xoá câu hỏi " + count.getQuestion() + " không thành công", 
										"Thông báo", JOptionPane.ERROR_MESSAGE);
							}	
						}else{
							Object[] options = {"Có", "Không"};
							int n = JOptionPane.showOptionDialog(parent,
									"Câu hỏi '" + count.getQuestion() +"' không thể xoá vì đã được sử dụng bởi một đề thi nào đó. \nBạn có muốn tiếp tục thêm những câu hỏi khác?",
								    "Thông báo",
								    JOptionPane.YES_NO_OPTION,
								    JOptionPane.QUESTION_MESSAGE,
								    null,		
								    options,
								    options);
							if(n== JOptionPane.YES_OPTION){
								continue;
							}else{
								doneAll = false;
								break;
							}
						}
					} catch (SQLException e1) {
						JOptionPane.showMessageDialog(parent, 
								"Có lỗi trong quá trình truy vấn câu hỏi :" + count.getQuestion(), 
								"Thông báo", JOptionPane.ERROR_MESSAGE);
						continue;
					}
									
				}
				if(doneAll){
					JOptionPane.showMessageDialog(parent, 
							"Thao tác hoàn tất", 
							"Thông báo", JOptionPane.INFORMATION_MESSAGE);
				}else{
					JOptionPane.showMessageDialog(parent, 
							"Thao tác đã được dừng lại giữa chừng", 
							"Thông báo", JOptionPane.INFORMATION_MESSAGE);
				}
				display.getJTable().setCellSelectionEnabled(false);
				display.getQuestionFromDB(questionType);
				parent.getLeftPanel().refresh();
			}
		}
	}
	
	class QuestionDelete extends AbstractAction{

		private static final long serialVersionUID = 1L;
		
		@Override
		public void actionPerformed(ActionEvent e) {
			Question ex = (Question) display.getModel().getValueAt(currentClickedRow, 0);
			Object[] options = {"Có",
                    "Không"};
			String content = "Bạn thực sự muốn xoá Câu hỏi này? \nChú ý: Khi xoá một Câu hỏi" +
                    " tất cả các câu trả lời có trong  câu hỏi đó cũng sẽ bị xoá!";
			int n = JOptionPane.showOptionDialog(getParent(),
				    content,
				    "Chú ý",
				    JOptionPane.YES_NO_OPTION,
				    JOptionPane.QUESTION_MESSAGE,
				    null,
				    options,
				    options);
			if(n == JOptionPane.YES_OPTION){
				try {
					if(GUIMain.getDb().CheckIfQuestionRemovable(ex.getQuestionID())){
						if(GUIMain.getDb().DeleteQuestion(ex.getQuestionID())){
							JOptionPane.showMessageDialog(parent, 
									"Xoá câu hỏi thành công", "Thông báo", 
									JOptionPane.INFORMATION_MESSAGE);
						}else{
							JOptionPane.showMessageDialog(parent, 
									"Xoá câu hỏi không thành công", "Thông báo", 
									JOptionPane.ERROR_MESSAGE);
						}
					}else{
						String temp = GUIMain.getDb().getQuestionsByQuestionID(ex.getQuestionID()).getQuestion();
						JOptionPane.showMessageDialog(parent, 
								"Câu hỏi '" + temp +"' không thể xoá vì đã được sử dụng bởi một đề thi nào đó.",
								"Thông báo", JOptionPane.ERROR_MESSAGE);
						display.getQuestionFromDB(questionType);
						parent.getLeftPanel().refresh();
						return;
					}
				} catch (SQLException e1) {
					JOptionPane.showMessageDialog(parent, 
							"Có lỗi trong quá trình truy vấn câu hỏi có mã câu hỏi :" + ex.getQuestion(), 
							"Thông báo", JOptionPane.ERROR_MESSAGE);
					display.getQuestionFromDB(questionType);
					parent.getLeftPanel().refresh();
					return;
				}
				
				display.getQuestionFromDB(questionType);
				parent.getLeftPanel().refresh();
			}
		}
	}

	class QuestionEdit extends AbstractAction{
		
		private static final long serialVersionUID = 1L;
		
		@Override
		public void actionPerformed(ActionEvent e) {
			GUIQuestionEdit ex = new GUIQuestionEdit(parent.getFrame(),
					display.getModel().getDisplayCollection().get(currentClickedRow).getQuestionID());
			ex.addWindowListener(new JDialogWindowListener());
			ex.setSize(500, 350);
			ex.setLocationRelativeTo(parent);
			ex.setVisible(true);
		}
	}
	
	class JDialogWindowListener extends WindowAdapter{

		@Override
		public void windowClosing(WindowEvent arg0) {
			super.windowClosing(arg0);
			if(questionType == null){
			}else{
				refresh(questionType);
			}
			parent.getLeftPanel().refresh();
			
		}

		@Override
		public void windowClosed(WindowEvent arg0) {
			super.windowClosed(arg0);
			if(questionType == null){
			}else{
				refresh(questionType);
			}
			parent.getLeftPanel().refresh();
		}	
	}
	
	class QuestionMouseListener extends MouseAdapter{
		
		@Override
		public void mouseClicked(MouseEvent e) {
			switch(e.getModifiers()) {
				case InputEvent.BUTTON1_MASK: {
					System.out.println("zxc");
					int temp = display.getJTable().rowAtPoint(e.getPoint());
					if(temp == -1) {
						refresh(questionType);
					}
					super.mouseClicked(e);	
					break;
		        }
				case InputEvent.BUTTON2_MASK: {    
					break;
		        }
				case InputEvent.BUTTON3_MASK: {
					int temp = display.getJTable().rowAtPoint(e.getPoint());
					if(temp == -1) return;
			        currentClickedRow = temp;
			        menu.show(e.getComponent(), e.getX(), e.getY());
			        break;
		        }
			}
		}
	}
	
	class QuestionSelectionListener implements ListSelectionListener{

		@Override
		public void valueChanged(ListSelectionEvent e) {
			if(!e.getValueIsAdjusting()){
				int[] temp = display.getJTable().getSelectedRows();
				if(temp.length == 0){
					moveButton.setEnabled(false);
					delButton.setEnabled(false);
					display.getCellEditor().stopCellEditing();
				}else{
					moveButton.setEnabled(true);
					delButton.setEnabled(true);
				}
				
			}
		}
	}
}
